package com.coder.rental.config;

import com.coder.rental.utils.Result;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
@Slf4j
public class GlobalException {

    @ExceptionHandler(value = Exception.class)
    public Result handleException(HttpServletRequest request, Exception e) {
        // 记录详细的异常信息，包括请求的信息
        log.error("Request URL : {}, HTTP Method : {}, IP : {}, Error message: {}",
                request.getRequestURL(), request.getMethod(), request.getRemoteAddr(), e.getMessage());
        log.error("Exception Stack Trace:", e);

        // 如果是特定类型的异常，可以在这里进行进一步的处理
        if (e instanceof IllegalArgumentException) {
            return Result.fail().setMessage("非法参数: " + e.getMessage());
        } else {
            // 默认处理
            return Result.fail().setMessage("服务器内部错误，请联系管理员");
        }
    }

    /**
     * 为特定异常类型提供专用的处理方法。
     */
    @ExceptionHandler(value = {HttpMessageNotReadableException.class})
    public Result handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
        log.error("JSON解析失败: {}", e.getMessage());
        log.error("Exception Stack Trace",e);
        return Result.fail().setMessage("请求体格式不正确或无法解析");
    }

}
